Java web filter login permission verification details

Keywords: JSP Session xml Java

Catalog

Three components of JavaWeb Filter

1. Workflow

2. Use scenario

3. Implementation process of filter method

4. Login permission verification case

Three components of JavaWeb Filter

1. Workflow

  • The client sends the http request to enter the filter first and execute the relevant business logic
  • If it is determined to pass, it will enter the Servlet logic. After the Servlet is executed, it will return to Filter, and finally return to the requester
  • Fail to determine, return directly, no need to send the request to the Servlet

Project rough data flow

2. Use scenario

  • In the filter layer, to obtain the user's identity and determine whether the user is logged in.
  • You can consider doing some regular checks in the filter layer.
  • Set utf-8 encoding to prevent page scrambling( case)

3. Implementation process of filter method

  • When creating a Filter object, call the init method
  • When destroying a Filter object, call the destroy method
  • When the request comes, call doFilter, which is the main business logic
  • Pass the request to the next Filter in the Filter chain. If the current Filter is the last Filter in the Filter chain, pass the request to the target Servlet (or JSP). Note: the order of intercepting multiple filters is related to the order of < Filter mapping > configuration. The first Filter is called first

4. Login permission verification case

1. Create a dynamic web project

2. Create LoginFilter project

What to do without a web.xml configuration file? When creating a project, you can create it by right clicking the following

3. Write login.jsp code of login interface as follows

<%@ 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>Login page</title>

</head>
<script type="text/javascript">
var value=  "${msg}";/* Is a general representation of an EL expression to get the values of the objects (parameters, objects, etc.) specified in {} */
if(value!="")
{alert(value);}
/* Used here to receive the error message from the filter */

</script>
<body>
	<form action="<%=request.getContextPath()%>/loginServlet" method="post">
		User name:<input type="text" name="userName" /> <br />
		 Password: <input type="password" name="userPwd" /> <br /> 
			<input type="submit" value="Sign in" />
	</form>
</body>
</html>

4. Create LoginServlet

package Servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginServlet extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doPost(request, response);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		
		System.out.println(request.toString());
		// Receiving parameters
		String userName = request.getParameter("userName");
		
		String userPwd = request.getParameter("userPwd");
		System.out.println("Full name"+userName+"Password:"+userPwd);
		String forward = null;
		// Judge whether the login is successful
		if (userName.equals("1") && userPwd.equals("2")) {
			// The login is successful. Here you can call JDBC to query the user password from the database to verify the login
			System.out.println("Login successfully");
			/*response.sendRedirect(request.getContextPath()+"/indexServlet");*/
			// Redirection: all variables stored in the previous response are invalid and enter a new response scope. Times cannot be used

			
			// Create session object
			HttpSession session = request.getSession();
			// Save user data in session domain object
			session.setAttribute("loginName", userName);
			// Forward: the variables stored in the previous request will not fail. It is like putting two pages together and successfully forwarding the login to the personal interface
			forward = "/index.jsp";
			RequestDispatcher dis = request.getRequestDispatcher(forward);
			dis.forward(request, response);
			return;

			// Jump to user home page

			// response.sendRedirect(request.getContextPath() + "/indexServlet");
		} else {
			// Login failed, request redirection
			String userName1 = request.getParameter("userName");
			
			String userPwd1 = request.getParameter("userPwd");
			System.out.println("Full name"+userName1+"Password:"+userPwd1);
			forward = "/fail.html";
			RequestDispatcher dis = request.getRequestDispatcher(forward);
			dis.forward(request, response);
			//response.sendRedirect(request.getContextPath() + "/fail.html");
		}

	}

}

Register servlet in web.xml

5. Write the index interface index.jsp after 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>Index page successfully logged in</title>
</head>
<body>
<%-- <%String user="";

String loginName = (String) session.getAttribute("loginName"); 
if(loginName== null){%>
<jsp:forward page="/login.jsp"></jsp:forward>

<% }%> --%><!-- Another kind of login verification, return directly without login login.jsp -->
<% String loginName = (String) session.getAttribute("loginName"); %>
//Welcome back: <% = loginname% >
<a href="person.jsp">Personal information</a>

</body>
</html>

6. Write personal information interface person.jsp

<%@ 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>Personal information</title>
</head>
<body>
<%-- <%String user="";

String loginName = (String) session.getAttribute("loginName"); 
if(loginName== null){%>
<jsp:forward page="/login.jsp"></jsp:forward>

<% }%> --%>
Full name:<% String loginName = (String) session.getAttribute("loginName"); %>
<%=loginName%>
<p>Times omit 10000 words of personal information</p>
<a href="/LoginFilter/logoutServlet">Cancellation</a>
</body>
</html>

7. Write logout Servlet.java

package Servlet;

import java.io.IOException;

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

/**
 * Servlet implementation class LoginoutServlet
 */
@WebServlet("/LoginoutServlet")
public class LogoutServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
     public LogoutServlet() {
        super();
     
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session = request.getSession();
		session.removeAttribute("loginName");
		System.out.println("Write off successfully");
		String forward="/login.jsp";
		RequestDispatcher dis = request.getRequestDispatcher(forward);

		dis.forward(request, response);
		//response.sendRedirect(request.getContextPath() +"/login.jsp");
	}

}

Also registered in web.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" version="3.1">
  <display-name>LoginFilter</display-name>
    <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>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>Servlet.LogoutServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/logoutServlet</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>

  </welcome-file-list>
</web-app>

After logging out, you can access person.jsp normally

In the browser address box, directly enter person.jsp as the suffix http://localhost: (enter your tomcat port number here) / LoginFilter/person.jsp

 

That's the problem

Can't access this page without login

 

8. Create a Filter class to inherit implements Filter

 

package gz.itcast.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;

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

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
	}

}

Register Filter in web.xml to Filter all requests

<?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" version="3.1">
  <display-name>LoginFilter</display-name>
    <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>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>Servlet.LogoutServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>LogoutServlet</servlet-name>
    <url-pattern>/logoutServlet</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>

  </welcome-file-list>
    <filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>

Writing verification logic in LoginFilter

Some request requests do not need to be verified for login, such as requesting the login page. At this time, we need to release these requests

chain.doFilter(request, response); forward the request to the next object on the filter chain. The next one here refers to the next filter. If there is no filter, it is the resource you requested. Generally, the filter is a chain, and there are several configured in web.xml. One by one: request - > filter1 - > Filter2 - > filter3 - > request resource

package filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet Filter implementation class LoginFilter
 */
@WebFilter("/LoginFilter")
public class LoginFilter implements Filter {
	public LoginFilter() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		/* When destroying a Filter object, call the destroy method */
		System.out.println("Filter destruction");
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		/* When the request comes, call doFilter, which is the main business logic */
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String servletPath = req.getServletPath();// Get target project address
		StringBuffer url = req.getRequestURL();// Get access URL
		// Some request requests do not need to be verified for login, such as requesting the login page. At this time, we need to release these requests
		if (servletPath != null && (servletPath.equals("/loginServlet") || (servletPath.equals("/login.jsp")))) {
			chain.doFilter(request, response);
			System.out.println(servletPath + ":No check");
			return;
		}else {//Otherwise, login verification is required to determine whether the user is logged in and obtain the session object
			HttpSession session = req.getSession();
			String user = (String) session.getAttribute("loginName");
			if (user == null) {
				RequestDispatcher requestDispatcher = req.getRequestDispatcher("/login.jsp");
				System.out.println(servletPath + ":You are not logged in, access is forbidden");
				req.setAttribute("msg", "You are not signed in, please sign in again");//Store error messages
				req.setAttribute("return_url", servletPath);
				requestDispatcher.forward(req, resp);//Request forwarded to login page
				return;
			} else {
				//If the user has logged in, it will be released directly
				chain.doFilter(request, response);
				System.out.println(servletPath + ":"+user+"User logged in,Can access");
				return;
			}
		}
		
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		/* When creating a Filter object, call the init method */
		System.out.println("Filter creation");
	}

}

It should be noted that

If the filter accesses the iltercss jpg do png js of the login page, it will be blocked, so add judgment to allow access to these resources

Add judgment to doFilter method

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		/* When the request comes, call doFilter, which is the main business logic */
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		String servletPath = req.getServletPath();// Get target project address
		StringBuffer url = req.getRequestURL();// Get access URL
		//If the filter accesses CSS JPG do PNG JS, it will be blocked, so add judgment to allow access to these resources  
		if (url.toString().endsWith(".jpg") || url.toString().endsWith(".css") || url.toString().endsWith(".js")
				|| url.toString().endsWith(".png") || url.toString().endsWith(".do")) {
	
			chain.doFilter(request, response);
			System.out.println(url.toString() + ": jpg css  js  png  do No check");
			return;
		} 
		// Some request requests do not need to be verified for login, such as requesting the login page. At this time, we need to release these requests
		if (servletPath != null && (servletPath.equals("/loginServlet") || (servletPath.equals("/login.jsp")))) {
			chain.doFilter(request, response);
			System.out.println(servletPath + ":No check");
			return;
		}else {//Otherwise, login verification is required to determine whether the user is logged in and obtain the session object
			HttpSession session = req.getSession();
			String user = (String) session.getAttribute("loginName");
			if (user == null) {
				RequestDispatcher requestDispatcher = req.getRequestDispatcher("/login.jsp");
				System.out.println(servletPath + ":You are not logged in, access is forbidden");
				req.setAttribute("msg", "You are not signed in, please sign in again");//Store error messages
				req.setAttribute("return_url", servletPath);
				requestDispatcher.forward(req, resp);//Request forwarded to login page
				return;
			} else {
				//If the user has logged in, it will be released directly
				chain.doFilter(request, response);
				System.out.println(servletPath + ":"+user+"User logged in,Can access");
				return;
			}
		}
		
	}

 

It's done!!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Published 4 original articles, won praise 7, visited 1908
Private letter follow

Posted by Immyphp on Fri, 10 Jan 2020 22:33:23 -0800