JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截
生活随笔
收集整理的這篇文章主要介紹了
JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
JavaWeb 入門篇(6.1) 過濾器 實現字符過濾器 實現模擬權限攔截
Filter(過濾器) 概述
- 過濾器是一個對象,它對對資源(Servlet或靜態內容)的請求或對資源的響應或兩者都執行過濾任務。
- 過濾器在doFilter方法中執行過濾。 每個過濾器都可以訪問一個FilterConfig對象,從中可以獲取其初始化參數,還可以訪問ServletContext,例如,它可以用于加載過濾任務所需的資源。
在Web應用程序的部署描述符中配置過濾器。 - JavaWeb中的應用場景:
- 權限過濾
- 字符編碼設置
- 數據加密過濾器
- 過濾垃圾請求
- 等等 還有不少勒
- 過濾器可以寫多個,形成一個過濾器鏈。每個過濾器的作用都可以不一樣。一層一層判斷。
流程圖:
一、過濾器(Filter)實現字符編碼設置為UTF-8
使用過濾器設置字符編碼
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;/*** @author crush*/ @WebFilter("/*") public class CharacterEncodingTest implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// filter的生命周期System.out.println("Filter初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=utf-8");System.out.println("過濾前");chain.doFilter(request,response);System.out.println("過濾后");}@Overridepublic void destroy() {System.out.println("Filter銷毀");} }測試:
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 java.io.IOException; import java.io.PrintWriter;/*** @author Adimi*/ @WebServlet("/filter") public class FilterTest extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String username = req.getParameter("username");PrintWriter writer = resp.getWriter();writer.print(username);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }可以看到過濾器是生效的。
二、Filter 實現權限攔截
登錄的表單頁面
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>login</title> </head> <body> <c:if test="${cuowu!=null}">${cuowu} </c:if> <form action="${pageContext.request.contextPath}/login" method="post">用戶名:<input name="username" type="text">密碼:<input name="password" type="password"><input type="submit" value="Login"> </form> </body> </html>User類(用戶類)
/*** @author crush*/ @Data /** get set 方法 */ @AllArgsConstructor /** 全參構造 */ @NoArgsConstructor /** 無參構造 */ @ToString /** toString方法 */ public class User {private String username;private String password; }此處使用了Lombok,類上面的幾個注解代替了原來的幾個方法。看起來比較簡潔。
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; import java.io.IOException; import java.io.PrintWriter;/*** @author crush*/ @WebServlet("/login") public class Login extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req,resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 開啟sessionHttpSession session = req.getSession();// 獲取登錄的參數String username = req.getParameter("username");String password=req.getParameter("password");PrintWriter writer = resp.getWriter();// 判斷用戶名和密碼是否正確if(username.equals("user")&&password.equals("123456")){// 存sessionsession.setAttribute("user",new User(username,password));// 設置session的時間session.setMaxInactiveInterval(200);writer.print(username+" 恭喜你登錄成功!!!");}else{System.out.println("賬號或密碼錯誤");resp.sendRedirect("/login.jsp");}} }過濾器:
import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import java.io.IOException;/*** @author Adimi* @WebFilter("/user/*") * /user/* 的意思是過濾/user/下的所有請求* 例如:/user/1 、/user/main2 .... /user/xxx 等等 都會經過這個過濾器*/ @WebFilter("/user/*") public class UserFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("初始化");}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest httpServletRequest=(HttpServletRequest)request;HttpSession session = ((HttpServletRequest) request).getSession();User user =(User) session.getAttribute("user");if(user!=null){chain.doFilter(request,response);}else{request.setAttribute("cuowu","檢測到您還沒有登錄,無法訪問,請登錄后再訪問!!!");request.getRequestDispatcher("/login.jsp").forward(request,response);}}@Overridepublic void destroy() {System.out.println("銷毀");} }測試的Servlet:
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 java.io.IOException; import java.io.PrintWriter;/*** @author crush*/ @WebServlet("/user/main") public class Main extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer = resp.getWriter();writer.print("恭喜你做出了登錄過濾的小Demo!!!");}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {super.doPost(req, resp);} }自言自語
簡單的一次記錄。
看完不給我點給贊,你還想逃嗎?不存在的。
留下你來過的足跡,一起學習。
總結
以上是生活随笔為你收集整理的JavaWeb入门篇(6) 实现字符过滤器 解决全局字符乱码 实现模拟权限拦截的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaWeb 入门篇 (5) Cook
- 下一篇: JavaWeb 入门篇(7) 初次总结