复盘一下这几天的学习成果。
目的是使用过滤器,让没有登录的用户访问不了部署在wenb项目下的资源列表。
本篇记录参考了
使用过滤器控制访问权限
项目结构
这里的web.xml与SessionFilter是参考上面文章博主的内容。
第一步
先看一下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">
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.lingaolu.servlet.SessionFilter</filter-class>
</filter>
<filter-mapping>
//这里的<url-pattern>/*</url-pattern>起了主要作用,这里的/*的意思是,只要请求里面有/,不管/后面是啥,这个过滤器都会过滤。
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
接下来就到了SessionFilter中的代码
package com.liutao.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionFilter implements Filter{
@Override
public void destroy() {
}
/**
* 核心过滤方法
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//获取代表用户请求、响应、会话的对象
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession servletSession = servletRequest.getSession();
// 获得用户请求的URI
String path = servletRequest.getRequestURI();
//允许访问login.jsp和tip.jsp以及ActionServlet
// ||path.contains(".png") ||(path.indexOf("/scenery")>-1)
if((path.indexOf("/Login.jsp")>-1)||(path.indexOf("/LoginServlet")>-1)){
chain.doFilter(request, response);
return;
//允许访问css文件和图片文件(如果不允许,那就看不到样式和图片了)
}else if(path.contains(".css") || path.contains(".jpg")|| path.contains(".gif")){
chain.doFilter(request, response);
return;
//允许访问js文件,注意不允许访问jsp文件!
}else if(path.contains(".js")&&(!path.contains("jsp"))){
chain.doFilter(request, response);
return;
}
//除上述允许访问的之外,如果未登录报无权限错误
//System.out.println("过滤器中的username"+((HttpServletRequest) request).getSession().getAttribute("username"));
if(((HttpServletRequest) request).getSession().getAttribute("username")==null){
System.out.println("您还未登录,不能访问!");
request.getRequestDispatcher("/Login.jsp").forward(request,response);
return;
}else{//如果已登录,则允许访问
chain.doFilter(request, response);
return;
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
这里的上半部分代码博主注释的很好,就不用过多解释了。
下半部分的代码书要是判断一个登录的功能。
第二步
编写一个简单的登录界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>我的JSP</title>
</head>
<body>
<div class="bg-images">
<form method="post" action="LoginServlet">
请输入账号<input type="username" name="username"><br>
请输入密码<input type="password" name="password">
<button type="submit">登录</button>
</form>
</div>
</body>
</html>
这里用的是session存储登录数据,写死了登录账号和密码。
对于session存储数据的方式,还不是很熟。
我是在LoginServlet中通过session存储数据的。
第三步
编写一个LoginServlet,用来中转判断登录用。
package com.liutao.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;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username_1 = request.getParameter("username");
String password_1 = request.getParameter("password");
request.getSession().setAttribute("username", username_1);
request.getSession().setAttribute("password", password_1);
String username = (String) request.getSession().getAttribute("username");
String password = (String) request.getSession().getAttribute("password");
// System.out.println("13username:"+username);
// System.out.println("13password:"+password);
// request.getRequestDispatcher("S.jsp").forward(request, response);
if("20201420".equals(username)&&"123456".equals(password)){
request.getRequestDispatcher("/welcome.jsp").forward(request, response);
}
else{
request.getRequestDispatcher("/Login.jsp").forward(request, response);
}
}
}
由于我之前在Login.jsp里面使用session.setAttribute之后,在LoginServlet中使用 request.getSession().setAttribute一直获取不到数据。所以我就用了最笨的方法。
welcome.jsp中写的是登陆成功之后的界面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
你已经登陆成功!!!欢迎您!
<form action="pictures/scenery/01.png">
<button type="submit">点击按钮访问资源</button>
</form>
</body>
</html>
最后
我们看到了这样的浏览器界面
在输入账号密码之后,他会跳转至
此时你点击按钮之后就可以根据按钮跳转的地址来跳转
这边由于跳转地址写的是pictures/scenery/01.png
他跳转到了
如果我们地址写的是pictures/scenery
他会跳转到scenery的目录上。
但是要tomcat能够访问文件目录需要更改一下设置
具体的方法如下:
1.打开tomcat文件目录下的conf目录
2.再打开其中的web.xml文件
3.找到其中的代码块
将<param-value>false<param-value>
中的false改为ture。(我这里是先改好了)
因为tomcat默认不让打开文件目录。
接下来就来试一下Filter的真正作用
这里,如果你没有登录,也就是session中没有存储到username数据,你就会被打回到登录界面
此时控制台输出
如果这时我们将过滤器中的代码稍作更改
修改后的代码
path.contains(".css") || path.contains(".jpg")|| path.contains(".gif")||path.contains(".png")
在这个else if 中添加一个path.contains(".png")
,你再去访问
当你访问的的地址是http://localhost:8090/FailterDemo_war_exploded/pictures/scenery/01.png
反馈的界面是
也就是你在未登录的情况下也访问到了文件下的图片。这就是过滤器起的作用。
他将请求地址末尾是.png的请求全部放行了,所以也就导致没有登录也能访问得到资源
但是我们将地址修改为
http://localhost:8090/FailterDemo_war_exploded/
会发现,过滤器依然过滤了该请求。
相同的是,如果我在SessionFilter中的第一个if语句中添加一个(path.indexOf("/scenery")
你就会发现,现在可以访问到刚才的地址了
到这里,也就是我这两天学习的成果。记录一下关于filter的一些知识。