Filter——实现用户自动登录功能

本章记录java后端的Filter过滤器的功能用法。

测试项目:

两个jsp页面,两页servlet代码,一页filter代码,以及配置xml等。

一.首先完成两个显示页面

1.login登录界面

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<center><h3>用户登录</h3></center>
<body style = "text-align:center;">
   <form action = "${pageContext.request.contextPath}/LoginServlet" method = "post">
      <table>
          <tr>
              <td height = "30" align = "center">用户名:</td>
              <td>&nbsp;&nbsp;
              <input type = "text" name = "username" />${errerMsg} </td>
          </tr>
          <tr>
              <td height = "30" align = "center">密码:</td>
              <td>&nbsp;&nbsp;
              <input type = "password" name = "password" /></td>
          </tr>
          <tr>
              <td height = "35" align = "center">自动登录时间</td>
              <td><input type = "radio" name = "autologin"
                    value = "${60*60*24*31}" />一个月
                  <input type = "radio" name = "autologin"
                    value = "${60*60*24*31*3}" />三个月
                  <input type = "radio" name = "autologin"
                    value = "${60*60*24*31*6}" />半年
                  <input type = "radio" name = "autologin"
                    value = "${60*90*24*31*12}" />一年
               </td>         
          </tr>
          <tr>
               <td height = "30" colspan = "2" align = "center">
                   <input type = "submit" value = "登录" />
                   &nbsp;&nbsp;&nbsp;&nbsp;
                   <input type = "reset" value = "重置" />
                </td>
          </tr>
      </table>
   </form>
</body>
</html>
  1. index登录成功界面
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8" import="java.util.*"%>
<%-- <%@ taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core" %> --%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>显示登录的用户信息</title>
</head>
<body>
     <br />
     <center>
          <h3>欢迎光临</h3>
     </center>
      <br />
       <br />
       <c:choose>
          <c:when test = "${sessionScope.user==null}">
          <a href = "login.jsp">用户登录</a>
          </c:when>
          <c:otherwise>
          欢迎你,${sessionScope.user.username} !
          <a href = "LogoutServlet">注销</a>
          </c:otherwise>  
       </c:choose>
       <hr />
</body>
</html>

二.Servlet代码

1.LoginServlet登录处理

package cn.edu.xit.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.edu.xit.domain.User;

/**
 * Servlet implementation class LoginServlet
 */
//@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LoginServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		String username = request.getParameter("username");  // login.jsp中的username
		String password = request.getParameter("password"); //同理
		// 检查用户名和密码
		if("itcast".equals(username) && "123456".equals(password)){
			// 登录成功
			User user = new User();
			user.setUsername(username); 
			user.setPassword(password);
			// 将用户状态user对象存入session域
			request.getSession().setAttribute("user", user);
			// 发送自动登录的cookie
			String autoLogin = request.getParameter("autologin"); //同理从login.jsp
			if(autoLogin != null){
				// 注意cookie中的密码要加密
				Cookie cookie = new Cookie("autologin",username + "-" + password);
				cookie.setMaxAge(Integer.parseInt(autoLogin)); // 设置过期时间
				cookie.setPath(request.getContextPath());
				response.addCookie(cookie);
			}
			// 跳转至首页
			response.sendRedirect(request.getContextPath() + "/index.jsp");
		}else{
			request.setAttribute("errerMsg", "用户名或密码错误");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request,response);
	}

}

2.LogoutServlet注销功能

package cn.edu.xit.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LogoutServlet
 */
//@WebServlet("/LogoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public LogoutServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 用户注销
		request.getSession().removeAttribute("user");
		// 从客户端删除自动登录的cookie
		Cookie cookie = new Cookie("autologin","msg"); // 用户名密码被msg代替
		//request.getContextPath()返回当前页面所在的应用的名字
		cookie.setPath(request.getContextPath()); //同一服务器内的cookie共享方法
		cookie.setMaxAge(0); // 清除设置的过期时间
		response.addCookie(cookie);
		response.sendRedirect(request.getContextPath() + "/index.jsp");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request,response);
	}

}

三.Filter过滤器

AutoLoginFilter实现自动登录

package cn.edu.xit.filter;

import java.io.IOException;

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.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import cn.edu.xit.domain.User;

/**
 * Servlet Filter implementation class AutoLoginFilter
 */
@WebFilter("/AutoLoginFilter")
public class AutoLoginFilter implements Filter {

    /**
     * Default constructor. 
     */
    public AutoLoginFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		HttpServletRequest request = (HttpServletRequest) req;
		// 获得一个名为autologin的cookie
		Cookie[] cookies = request.getCookies();
		String autologin = null;
		for(int i = 0;cookies != null && i < cookies.length; i++){
			if("autologin".equals(cookies[i].getName())){
				// 找到了指定的cookie
				autologin = cookies[i].getValue();
				break;
			}
		}
		if(autologin!=null){
			// 做自动登录
			String[] parts = autologin.split("-");
			String username = parts[0];
			String password = parts[1];
			// 检查用户名和密码
			if("itcast".equals(username) && ("123456").equals(password)){
				// 登录成功,将用户状态user对象存入session域
				User user = new User();
				user.setUsername(username);
				user.setPassword(password);
				request.getSession().setAttribute("user", user);
			}
		}
		// pass the request along the filter chain
		// 放行
		chain.doFilter(request, resp);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

写一个封装类保存用户名和密码

package cn.edu.xit.domain;

public class User {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

}

最后完善一下xml文件配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>web008</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <filter>
    <filter-name>AutoLoginFilter</filter-name>
    <filter-class>cn.edu.xit.filter.AutoLoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>AutoLoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.edu.xit.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/LoginServlet</url-pattern>
  </servlet-mapping>
  <servlet>
    <servlet-name>LogoutServlet</servlet-name>
    <servlet-class>cn.edu.xit.servlet.LogoutServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/LogoutServlet</url-pattern>
  </servlet-mapping>
</web-app>

项目由教材提供…

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BeJav

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值