使用Filter实现用户自动登录

        java Servlet技术中Filter可以实现对请求的统一预处理,使请求有统一的可以控制的入口和出口,用Filter可以轻松解决全站的乱码问题:

	request.setCharacterEncoding(charset);  //post  get
	response.setCharacterEncoding(charset);
	response.setContentType("text/html;charset=" + charset); //设置在Filter参数中

对动态资源加禁止缓冲头:

	response.setDateHeader("Expires",-1);
	response.setHeader("Cache-Control","no-cache");
	response.setHeader("Pragma","no-cache");

对静态资源加缓存头:

	//1.获取到用户想访问的资源
	String uri = request.getRequestURI();
	//2.获取该资源的缓存时间
	int expires = 0;
	if(uri.endsWith(".jpg")){
		expires = Integer.parseInt(this.config.getInitParameter("jpg"));
	}else if(uri.endsWith(".css")){
		expires = Integer.parseInt(this.config.getInitParameter("css"));
	}else{
		expires = Integer.parseInt(this.config.getInitParameter("js"));
	}	
	response.setDateHeader("expires", System.currentTimeMillis()+expires*60*1000);

及实现数据压缩发生等

        使用Filter实现用户自动登录是Fiter能轻松实现的一项非常重要的功能,实现如下:

        1.用户登录时选择是否要自动登录:

<input name="autoLogin" type="checkbox" value="true" checked/>自动登录 

        2.servlet处理用户登录请求,如果选择自动登录,则发送一个可以实现自动登录的Cookie:

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        try {
            String name = request.getParameter("name");
            String password = request.getParameter("password");
            if (name.trim().equals(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下使用Filter实现用户自动登录的代码示例: ```java public class AutoLoginFilter implements Filter { private final String LOGIN_PAGE = "/login.jsp"; private final String LOGIN_ACTION = "/login"; private final String USERNAME_PARAM = "username"; private final String PASSWORD_PARAM = "password"; private final String REMEMBER_ME_PARAM = "rememberMe"; private final String REMEMBER_ME_COOKIE_NAME = "rememberMeCookie"; private final int REMEMBER_ME_COOKIE_MAX_AGE = 7 * 24 * 60 * 60; private UserService userService; @Override public void init(FilterConfig filterConfig) throws ServletException { ServletContext servletContext = filterConfig.getServletContext(); ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); userService = context.getBean(UserService.class); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; HttpSession session = httpRequest.getSession(); // 如果用户已经登录,则直接放行 if (session.getAttribute("user") != null) { chain.doFilter(request, response); return; } // 如果用户访问的是登录页面,则直接放行 if (httpRequest.getRequestURI().endsWith(LOGIN_PAGE)) { chain.doFilter(request, response); return; } // 如果用户提交的是登录请求,则进行自动登录处理 if (httpRequest.getRequestURI().endsWith(LOGIN_ACTION)) { String username = httpRequest.getParameter(USERNAME_PARAM); String password = httpRequest.getParameter(PASSWORD_PARAM); String rememberMe = httpRequest.getParameter(REMEMBER_ME_PARAM); User user = userService.getUserByUsernameAndPassword(username, password); if (user != null) { // 将用户息保存到session中 session.setAttribute("user", user); // 如果用户选择了“记住我”选项,则创建一个cookie保存用户息 if ("true".equals(rememberMe)) { Cookie cookie = new Cookie(REMEMBER_ME_COOKIE_NAME, username + ":" + password); cookie.setMaxAge(REMEMBER_ME_COOKIE_MAX_AGE); httpResponse.addCookie(cookie); } // 登录成功,跳转到首页 httpResponse.sendRedirect(httpRequest.getContextPath() + "/index.jsp"); } else { // 登录失败,返回登录页面并显示错误息 httpRequest.setAttribute("error", "用户名或密码错误"); httpRequest.getRequestDispatcher(LOGIN_PAGE).forward(request, response); } return; } // 如果用户访问的是其他页面,则尝试自动登录 Cookie[] cookies = httpRequest.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(REMEMBER_ME_COOKIE_NAME)) { String value = cookie.getValue(); String[] parts = value.split(":"); String username = parts[0]; String password = parts[1]; User user = userService.getUserByUsernameAndPassword(username, password); if (user != null) { // 将用户息保存到session中 session.setAttribute("user", user); // 自动登录成功,放行 chain.doFilter(request, response); return; } } } } // 如果无法自动登录,则跳转到登录页面 httpResponse.sendRedirect(httpRequest.getContextPath() + LOGIN_PAGE); } @Override public void destroy() { // do nothing } } ``` 在上面的代码中,我们定义了一个名为`AutoLoginFilter`的过滤器,用于实现用户自动登录功能。该过滤器具有以下特点: 1. 当用户访问的是登录页面时,直接放行,不进行任何操作。 2. 当用户提交的是登录请求时,如果用户名和密码正确,则将用户息保存到session中,并根据用户是否选择了“记住我”选项,创建或删除一个Cookie来保存或清除用户息。然后将用户重定向到首页。如果用户名和密码错误,则返回登录页面并显示错误息。 3. 当用户访问的是其他页面时,首先尝试从Cookie中获取用户息进行自动登录。如果能够自动登录,则将用户息保存到session中,并直接放行。如果无法自动登录,则重定向到登录页面。 需要注意的是,在上面的代码中,我们使用了Spring框架的依赖注入功能,从而可以轻松地获取`UserService`对象,用于查询数据库中的用户息。如果您没有使用Spring框架,可以将`UserService`替换为自己的用户服务类。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值