实验要求
按课程讲解创建过滤器,并完成相关配置,使页面1和页面2都使用过滤器,假设页面1为登录页面,页面2为业务页面,在过滤器中验证有效登录信息,如果没有登录则可以提示并跳转到登录页面。
实验过程
(1)代码编写
编码过滤器
package filter;
import javax.servlet.*;
import java.io.IOException;
public class EncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException { }
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request,response);
}
public void destroy() { }
}
登录信息验证过滤器
package filter;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class LoginFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException { }
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
//0.强制转换
HttpServletRequest request = (HttpServletRequest) servletRequest;
//1.获取资源请求路径
String uri = request.getRequestURI();
//2.判断是否包含登录相关资源路径
if(uri.contains("/login.jsp") || uri.contains("/loginServlet") ){
//包含,用户就是想登录。放行
chain.doFilter(servletRequest, servletResponse);
}else{
//不包含,需要验证用户是否登录
//3.从获取session中获取 account
Object user = request.getSession().getAttribute("account");
if(user != null){
//登录了
chain.doFilter(servletRequest, servletResponse);
}else{
//没有登录。跳转登录页面
request.setAttribute("login_msg","您尚未登录,请登录");
request.getRequestDispatcher("/login.jsp").forward(request,servletResponse);
}
}
// chain.doFilter(servletRequest, servletResponse);
}
public void destroy() { }
}
登录业务servlet代码
package servlets;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.print("LoginServlet:");
//获取JSP传过来的 account
String account= request.getParameter("account");
//判断username是否为空
if(account!=null){
//account不为空,将account设置在session中
request.getSession().setAttribute("account", account);
System.out.println(account+"登录成功");
request.getRequestDispatcher("/business.jsp").forward(request, response);
}
else{
System.out.println("登录失败");
}
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
doPost(request,response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException, IOException {
service(request,response);
}
}
业务应用servlet代码
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DealWithServlet 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{
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
String stuname = request.getParameter("stuname");
System.out.println("查询学生信息业务:学生姓名:"+stuname);
out.println("学生姓名:"+stuname);
out.println("<br>学      号:123456<br>");
out.println("学      院:信息工程学院<br>");
out.println("班      级:JavaWeb班<br>");
}
}
登录页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录页面</title>
</head>
<body>
<%
String str = (String) request.getAttribute("login_msg");
if(str!=null){
out.println(str);
}
%>
<form action="/pro9/servlets/LoginServlet" method="post" name="form1">
欢迎登录:<br>
输入账号:<input type="text" name="account"><br>
输入密码:<input type="password" name="password"><br>
<input type="submit" value="登录"><br>
</form>
<input type="button" onclick="window.location.href='/pro9/business.jsp'" value="业务页面"><br>
</body>
</html>
业务请求页面编写
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>业务页面</title>
</head>
<body>
业务页面<br>
<form action="/pro9/servlets/DealWithServlet" method="post">
请输入学生信息的模糊资料:
<input type="text" name="stuname"><br>
<input type="submit" value="查询">
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>DealWithServlet</servlet-name>
<servlet-class>servlets.DealWithServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DealWithServlet</servlet-name>
<url-pattern>/servlets/DealWithServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>servlets.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/servlets/LoginServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>servlets.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlets/TestServlet</url-pattern>
</servlet-mapping>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>filter.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/servlets/DealWithServlet</url-pattern>
</filter-mapping>
</web-app>
(2)项目文件结构
![](https://img-blog.csdnimg.cn/930f3f4a49a54a1cab56cfd463c7f151.png#pic_center)
(3)网页效果展示
进入业务页面,发送业务请求,过滤器验证没有登录,直接跳转登录页面
![](https://img-blog.csdnimg.cn/db51fbe7ca874896bea3ea7e5e724b12.png#pic_center)
登录页面提示:未登录(如果是直接进入而不是跳转的,不会显示该提示)
密码和账号任意
![](https://img-blog.csdnimg.cn/c3197b347bcb4e419808757a99316d3e.png#pic_center)
登录后,过滤器验证通过,直接跳转到业务页面
![](https://img-blog.csdnimg.cn/f960b41d604a4c3fb39b1e38e4e4ce35.png#pic_center)
发送业务请求,过滤器验证已登录,后端处理业务,显示在前端
![](https://img-blog.csdnimg.cn/49c02ec405d64613bb7d36ac03ebb1af.png#pic_center)
实验总结
在servler应用中,输出中文到前端,可能会出现乱码,因为一般浏览器默认编码格式为gb2312。如果不用过滤器,则需要设置编码,且以下两句代码位置不能交换
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();