实现用户自动登陆的过滤器
原理:在用户登陆成功后,以cookis形式发送用户名、密码给客户端
编写一个过滤器,filter方法中检查cookie中是否带有用户名、密码信息,如果存在则调用业务层登陆方法,登陆成功后则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆
package com.jjyy.web;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.jjyy.domain.User;
import com.jjyy.util.DaoUtils;
import com.jjyy.util.MD5Utils;
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//1.获取用户名密码
String name = request.getParameter("name");
String password = MD5Utils.md5(request.getParameter("password"));
//2.校验用户名密码
String sql = "select * from user where name = ? and password = ? ";
User user = null;
try {
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class),name,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user == null){
response.getWriter().write("用户名密码不正确");
return;
}else{
//3.登录用户
request.getSession().setAttribute("user", user);
// 如果用户勾选过30天内自动登陆,发送自动登陆cookie
if("true".equals(request.getParameter("autologin"))){
Cookie autologinC = new Cookie("autologin",user.getName()+":"+user.getPassword());
autologinC.setPath(request.getContextPath());
autologinC.setMaxAge(3600*24*30);
response.addCookie(autologinC);
}
//4.重定向到主页
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.jjyy.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogoutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if(request.getSession(false)!=null){
request.getSession().invalidate();
}
response.sendRedirect(request.getContextPath()+"/index.jsp");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
package com.jjyy.domain;
import java.io.Serializable;
public class User implements Serializable {
private int id;
private String name;
private String password;
private String role;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
}
package com.jjyy.filter;
import java.io.IOException;
import java.sql.SQLException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.registry.infomodel.User;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.jjyy.util.DaoUtils;
/**
* autoLoginFilter
* @author JiangYu
*
*/
public class AutoLoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
//1.只有未登录的用户才能自动登陆
if(req.getSession(false)==null || req.getSession().getAttribute("user")==null){
//2.只有带了自动登陆cookie的用户才能自动登陆
Cookie [] cs = req.getCookies();
Cookie findC = null;
if(cs!=null){
for(Cookie c : cs){
if("autologin".equals(c.getName())){
findC = c;
break;
}
}
}
if(findC!=null){
//3.自动登录Cookie中保存的用户名密码都需要是正确的才能自动登陆
String name = findC.getValue().split(":")[0];
String password= findC.getValue().split(":")[1];
String sql = "select * from user where name = ? and password = ? ";
User user = null;
try {
QueryRunner runner = new QueryRunner(DaoUtils.getSource());
user = runner.query(sql, new BeanHandler<User>(User.class),name,password);
} catch (SQLException e) {
e.printStackTrace();
}
if(user!=null){
req.getSession().setAttribute("user", user);
}
}
}
//无论是否自动登陆,都放行资源
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
package com.jjyy.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class EncodeFilter implements Filter {
private FilterConfig config = null;
private String encode = null;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//响应的乱码处理
response.setContentType("text/html;charset=utf-8");
//装饰
chain.doFilter(new MyHttpServletRequest((HttpServletRequest)request), response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.config = filterConfig;
this.encode = config.getInitParameter("encode")==null?"utf-8":config.getInitParameter("encode");
}
//请求乱码的处理
class MyHttpServletRequest extends HttpServletRequestWrapper{
private HttpServletRequest request = null;
boolean isNotEncode = true;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public Map getParameterMap() {
try {
if(request.getMethod().equalsIgnoreCase("POST")){
request.setCharacterEncoding(encode);
return request.getParameterMap();
}else if(request.getMethod().equalsIgnoreCase("GET")){
//request.getParameterMap()第一次会解决,然后缓存起来
//request.getParameterMap()第二次直接从缓存中的map
Map<String,String[]> map = request.getParameterMap();
if(isNotEncode){
for(Map.Entry<String, String[]> entry:map.entrySet()){
String [] vs = entry.getValue();
for(int i=0;i<vs.length;i++){
vs[i]= new String(vs[i].getBytes("iso8859-1"),encode);
}
}
isNotEncode = false;
}
return map;
}else{
return request.getParameterMap();
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
return getParameterValues(name)==null?null:getParameterValues(name)[0];
}
@Override
public String[] getParameterValues(String name) {
return (String[])getParameterMap().get(name);
}
}
}
package com.jjyy.util;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class MD5Utils {
public static String md5(String plainText) {
byte[] secretBytes = null;
try {
secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("没有md5这个算法!");
}
String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
}
package com.jjyy.util;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class DaoUtils {
private static DataSource source = new ComboPooledDataSource();
private DaoUtils() {
}
public static DataSource getSource(){
return source;
}
public static Connection getConn(){
try {
return source.getConnection();
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
分享到:
相关推荐
标题"libusb-win32-devel-filter-1.2.6.0"指的是一个针对Windows操作系统,专为libusb库开发的过滤器驱动程序的版本号为1.2.6.0的开发包。libusb是一个开源库,它允许用户在不依赖操作系统特定的底层驱动的情况下...
`<filter-name>`用于定义过滤器的唯一标识,`<filter-class>`指定过滤器的实现类,`<url-pattern>`则定义了哪些URL路径会触发该过滤器。 2. **生命周期**:Filter有初始化(init)、执行(doFilter)和销毁...
FFmpeg Filter 过滤器是FFmpeg项目中用于音视频数据处理的一个重要组件,通过libavfilter库提供丰富的视频和音频过滤功能。这些过滤器可以在不同阶段对媒体数据进行操作,包括但不限于格式转换、帧率调整、大小缩放...
【如何配置Filter过滤器处理JSP中文乱码】 在开发Java Web应用时,尤其是在处理包含中文字符的请求时,可能会遇到中文乱码的问题。解决这个问题的一种常见方法是使用Filter过滤器。以下是配置Filter过滤器处理JSP...
一个过滤器可以被应用于多个URL模式,也可以有多个过滤器应用于同一个URL模式,这取决于`web.xml`或注解的配置。 7. **Filter的异常处理** 在`doFilter()`方法中,如果抛出未捕获的异常,容器会自动调用`destroy...
配置文件中会定义过滤器的`<filter>`和`<filter-mapping>`元素,指明过滤器类及其需要拦截的URL模式。例如,所有需要登录才能访问的资源路径都会被配置在这个过滤器下。 6. **实践步骤**: - 编写Filter实现类,...
在标题"JAVAWEB-19:JDBC之过滤器Filter"中,我们关注的是如何利用过滤器来优化JDBC操作。JDBC(Java Database Connectivity)是Java语言中访问数据库的标准API,它允许Java程序与各种类型的数据库进行交互。然而,...
过滤器可以用于登录验证、字符编码转换、日志记录、性能监控等多种场景。 **Filter的工作原理:** 1. **初始化**:当Web应用被部署时,Servlet容器会实例化每个Filter,并调用其init()方法进行初始化。 2. **过滤链...
总的来说,pjl-comp-filter-1.8.1是一个旨在提升Web服务器性能的Java过滤器,通过智能地应用数据压缩,实现了资源的有效利用和系统效率的提升。开发者可以利用这个库来优化他们的服务,特别是在处理大量用户请求时,...
在Spring Boot应用中,Servlet 3.0过滤器(Filter)是实现请求处理前和处理后逻辑的重要组件。过滤器可以拦截HTTP请求,对请求和响应进行预处理和后处理,比如登录验证、数据编码解码、日志记录等。Spring Boot通过...
此配置使`LoggerFilter`过滤器应用于所有Web资源,实现全局日志记录。 2. **过滤特定类型文件** ```xml <filter> <filter-name>loggerfilter</filter-name> <filter-class>myfilter.LoggerFilter</filter-...
3. **自动登录**:当用户登录后,可以通过过滤器实现自动登录功能,即在后续请求中自动携带用户身份信息,无需每次请求都验证。 **过滤器的作用** 过滤器通过实现Java的`javax.servlet.Filter`接口来创建。在Web...
在这个过滤器的`doFilter`方法中,我们可以检查请求是否带有自动登录相关的Cookie。如果找到该Cookie,就从Cookie中解析出用户信息,并将其设置到Servlet上下文或者ActionContext中,这样后续的Action就能获取到用户...
在`web.xml`文件中,我们需要为每个`Filter`定义一个配置项,包括`filter-name`(过滤器的唯一标识)、`filter-class`(过滤器类的全限定名)以及`<url-pattern>`(定义需要过滤的URL模式)。例如: ```xml ...
总结来说,本案例通过`Filter`接口的实现,演示了如何在Java Web应用中进行身份验证,通过过滤器拦截请求,检查用户是否已经登录,避免在每个需要验证的页面上重复编写验证代码。这种方式提高了代码的可维护性和安全...
name=John`,Eloquent会自动应用相应的过滤器。 这个库支持多种过滤操作,如等于、不等于、大于、小于、包含、不包含等,甚至可以实现自定义复杂的过滤逻辑。同时,过滤器可以链式调用,实现多个条件的组合查询。 ...
GridControl 的过滤器机制允许开发者在数据表格中应用过滤条件,以快速检索和显示特定的数据记录。过滤器可以应用于单个列或多个列,並可以使用逻辑操作符(AND、OR、NOT)来组合多个过滤条件。 自定义过滤器的需求...
过滤器可以用来做多种任务,包括登录验证、URL重写、字符编码转换等,而权限管理是其中的一个关键应用。 1. **Filter的基本概念** - Filter接口:它包含三个方法,`doFilter()`, `init()`, 和 `destroy()`。`...
3. **配置过滤器**:在Spring的配置文件(如applicationContext.xml或dispatcher-servlet.xml)中,使用`<filter>`和`<filter-mapping>`元素来注册和映射我们的登录过滤器。这样,Spring就会在处理每个请求前调用...
在深入分析和探讨过滤器在Java Web开发中的应用研究时,首先要了解过滤器的定义及其在Java Web开发中的重要作用。过滤器是一种设计模式,用于拦截请求和响应,以便执行某些预处理或后处理操作。在Java Web开发中,...