遇到的问题:
通过 servlet程序的请求转发命令,访问被Filter过滤器保护的目标资源。
希望通过Filter内添加的打印语句,查看是否会经过过滤器。但是不生效,不会打印任何结果。也无法调转到目标资源
下为jsp页面代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<a href="admin/a.jsp">点击跳转</a>
<form action="http://localhost:8080/_15_Filter/clickServlet" method="get">
用户名:<input type="text" name="username" id="username"><br>
密 码:<input type="password" name="password" id="password"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
下为Servlet程序
通过页面代码的表单提交到该Servlet程序,不存储user到Session中。
public class ClickServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决响应的数据中文乱码
resp.setContentType("text/html; charset=UTF-8");
// 获取参数username
String username = req.getParameter("username");
// 获取参数password
String password = req.getParameter("password");
// 判断用户,密码是否匹配
if ("123".equals(username) && "123".equals(password)){
req.getRequestDispatcher("admin/a.jsp").forward(req, resp);
} else {
// 不匹配,返回登录界面
req.getRequestDispatcher("login.jsp").forward(req, resp);
}
}
}
下为 Filter程序
作用:想要过滤没有登陆过的用户访问
使用 Session域中是否存在'user',来判断是否登录
public class AdminFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 类型转换成HttpServletRequest、HttpServletResponse
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
// 对用户是否登录做一个筛选
Object user = httpServletRequest.getSession().getAttribute("user");
if (user == null){
// 如果用户没有登录,则跳转到登陆界面
System.out.println("被拦截了!!");
httpServletRequest.getRequestDispatcher("/logina.jsp").forward(httpServletRequest, httpServletResponse);
} else{
// 让程序继续往下访问用户的目标资源
System.out.println("访问成功!!");
filterChain.doFilter(servletRequest, servletResponse);
}
}
@Override
public void destroy() {
}
}
只要实现了Filter接口,所有的请求都会被拦截