`
Before_Morning
  • 浏览: 38178 次
文章分类
社区版块
存档分类
最新评论

过滤器的应用之自动登录--filter(三)

 
阅读更多

实现用户自动登陆的过滤器

原理:在用户登陆成功后,以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

    标题"libusb-win32-devel-filter-1.2.6.0"指的是一个针对Windows操作系统,专为libusb库开发的过滤器驱动程序的版本号为1.2.6.0的开发包。libusb是一个开源库,它允许用户在不依赖操作系统特定的底层驱动的情况下...

    过滤器filter和监听器listener的应用总结

    `&lt;filter-name&gt;`用于定义过滤器的唯一标识,`&lt;filter-class&gt;`指定过滤器的实现类,`&lt;url-pattern&gt;`则定义了哪些URL路径会触发该过滤器。 2. **生命周期**:Filter有初始化(init)、执行(doFilter)和销毁...

    ffmpeg filter过滤器基础实例以及全面解析

    FFmpeg Filter 过滤器是FFmpeg项目中用于音视频数据处理的一个重要组件,通过libavfilter库提供丰富的视频和音频过滤功能。这些过滤器可以在不同阶段对媒体数据进行操作,包括但不限于格式转换、帧率调整、大小缩放...

    如何配置Filter过滤器处理JSP中文乱码

    【如何配置Filter过滤器处理JSP中文乱码】 在开发Java Web应用时,尤其是在处理包含中文字符的请求时,可能会遇到中文乱码的问题。解决这个问题的一种常见方法是使用Filter过滤器。以下是配置Filter过滤器处理JSP...

    JAVAEE过滤器的使用

    一个过滤器可以被应用于多个URL模式,也可以有多个过滤器应用于同一个URL模式,这取决于`web.xml`或注解的配置。 7. **Filter的异常处理** 在`doFilter()`方法中,如果抛出未捕获的异常,容器会自动调用`destroy...

    servlet 过滤器做的简单登陆demo

    配置文件中会定义过滤器的`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素,指明过滤器类及其需要拦截的URL模式。例如,所有需要登录才能访问的资源路径都会被配置在这个过滤器下。 6. **实践步骤**: - 编写Filter实现类,...

    JAVAWEB-19:JDBC之过滤器Filter

    在标题"JAVAWEB-19:JDBC之过滤器Filter"中,我们关注的是如何利用过滤器来优化JDBC操作。JDBC(Java Database Connectivity)是Java语言中访问数据库的标准API,它允许Java程序与各种类型的数据库进行交互。然而,...

    filter过滤器的简单使用.rar

    过滤器可以用于登录验证、字符编码转换、日志记录、性能监控等多种场景。 **Filter的工作原理:** 1. **初始化**:当Web应用被部署时,Servlet容器会实例化每个Filter,并调用其init()方法进行初始化。 2. **过滤链...

    pjl-comp-filter-1.8.1

    总的来说,pjl-comp-filter-1.8.1是一个旨在提升Web服务器性能的Java过滤器,通过智能地应用数据压缩,实现了资源的有效利用和系统效率的提升。开发者可以利用这个库来优化他们的服务,特别是在处理大量用户请求时,...

    springboot-Servlet3.0过滤器

    在Spring Boot应用中,Servlet 3.0过滤器(Filter)是实现请求处理前和处理后逻辑的重要组件。过滤器可以拦截HTTP请求,对请求和响应进行预处理和后处理,比如登录验证、数据编码解码、日志记录等。Spring Boot通过...

    Struts 2 过滤器的总结

    此配置使`LoggerFilter`过滤器应用于所有Web资源,实现全局日志记录。 2. **过滤特定类型文件** ```xml &lt;filter&gt; &lt;filter-name&gt;loggerfilter&lt;/filter-name&gt; &lt;filter-class&gt;myfilter.LoggerFilter&lt;/filter-...

    过滤器文档过滤器使用中的方法过滤器.pdf

    3. **自动登录**:当用户登录后,可以通过过滤器实现自动登录功能,即在后续请求中自动携带用户身份信息,无需每次请求都验证。 **过滤器的作用** 过滤器通过实现Java的`javax.servlet.Filter`接口来创建。在Web...

    struts2用cookie实现自动登录中用过滤器执行读取上下文方法

    在这个过滤器的`doFilter`方法中,我们可以检查请求是否带有自动登录相关的Cookie。如果找到该Cookie,就从Cookie中解析出用户信息,并将其设置到Servlet上下文或者ActionContext中,这样后续的Action就能获取到用户...

    Filter实现自动登陆_源代码

    在`web.xml`文件中,我们需要为每个`Filter`定义一个配置项,包括`filter-name`(过滤器的唯一标识)、`filter-class`(过滤器类的全限定名)以及`&lt;url-pattern&gt;`(定义需要过滤的URL模式)。例如: ```xml ...

    Java Web应用开发 52 课堂案例-应用过滤器进行身份验证.docx

    总结来说,本案例通过`Filter`接口的实现,演示了如何在Java Web应用中进行身份验证,通过过滤器拦截请求,检查用户是否已经登录,避免在每个需要验证的页面上重复编写验证代码。这种方式提高了代码的可维护性和安全...

    Laravel开发-laravel-eloquent-filter

    name=John`,Eloquent会自动应用相应的过滤器。 这个库支持多种过滤操作,如等于、不等于、大于、小于、包含、不包含等,甚至可以实现自定义复杂的过滤逻辑。同时,过滤器可以链式调用,实现多个条件的组合查询。 ...

    GridControl的过滤器的自定义

    GridControl 的过滤器机制允许开发者在数据表格中应用过滤条件,以快速检索和显示特定的数据记录。过滤器可以应用于单个列或多个列,並可以使用逻辑操作符(AND、OR、NOT)来组合多个过滤条件。 自定义过滤器的需求...

    通过过滤器管理用户权限(2)

    过滤器可以用来做多种任务,包括登录验证、URL重写、字符编码转换等,而权限管理是其中的一个关键应用。 1. **Filter的基本概念** - Filter接口:它包含三个方法,`doFilter()`, `init()`, 和 `destroy()`。`...

    idea+maven+springmvc 登录过滤器

    3. **配置过滤器**:在Spring的配置文件(如applicationContext.xml或dispatcher-servlet.xml)中,使用`&lt;filter&gt;`和`&lt;filter-mapping&gt;`元素来注册和映射我们的登录过滤器。这样,Spring就会在处理每个请求前调用...

    过滤器在Java Web开发中的应用研究.pdf

    在深入分析和探讨过滤器在Java Web开发中的应用研究时,首先要了解过滤器的定义及其在Java Web开发中的重要作用。过滤器是一种设计模式,用于拦截请求和响应,以便执行某些预处理或后处理操作。在Java Web开发中,...

Global site tag (gtag.js) - Google Analytics