JavaWeb
过滤器应用
- 用户登录之后才能进入主页!用户注销后就不能静茹主页了!
总结:
JSP页面提交表单给servlet时有两种写法:
(一). 相对路径: < form action=servlet/RegisterLoginServlet method=post>…< /form>
(二). 绝对路径:
- < form action="/项目名/servlet/RegisterLoginServlet " method=post>…< /form>
其实绝对路径还有第二种方法:
- <formaction="<%=request.getContextPath()%>/servlet/RegisterLoginServlet " method=post>…< /form>
- Login.jsp界面
<body>
<h1>登录</h1>
<%--登录界面,获取数据提交到后台,处理,通过web.xml文件中配置的路径login--%>
<%--这里注意login最前面不要加/--%>
<form action="login" method="post">
<input type="text" name="username">
<input type="submit">
</form>
</body>
- web.xml中配置login
<!--将Login.jsp界面的数据,转到LoginServlet类中进行处理-->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.feng.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
- LoginServlet
//获取数据,处理数据,登录成功,就给Session赋值,并然后跳转成功页面,登录失败,就跳转到失败界面。
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");//获取前端请求来的参数
if(username.equals("admin")){//登录成功
req.getSession().setAttribute("USER_NAME",req.getSession().getId());//给Session赋值随便赋什么值都可以,这里就用它自己的id
//然后跳转成功页面
resp.sendRedirect("sys/success.jsp");
}else{//登录失败
//跳转到失败界面
resp.sendRedirect("error.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 失败界面 :error.jsp
<body>
<h1>登录失败</h1>
<h3>用户名输入错误</h3>
<--这里点击,又可以直接返回到,登录界面-->
<%--这里注意login.jsp最前面不要加/--%>
<a href="Login.jsp">返回登录页面</a>
</body>
成功界面:success.jsp
<body>
<h1>主页</h1>
<--点击注销,就会进入后台程序,进行session的注销-->
<--success.jsp界面是在sys文件夹中的,这里会从sys文件夹中出来,找Logout-->
<p><a href="<%=request.getContextPath()%>/logout">注销</a></p>
</body>
- 这里注意我用了logout的绝对路径,因为当前success.jsp界面是再sys文件下的,不是再整个web项目下的,因此如果不加绝对路径,再前端网页中每次点击注销,它都会再sys文件中找logout,通俗点说,就是它再sys文件中出不来,他自己不会再全局下找logout,因此要想找到logout,就直接写上它的绝对路径
- web.xml界面中配置logout
从上面的页面点击注销,就会通过XML文件中的配置,进入后台Java程序LogoutServlet
<servlet>
<servlet-name>logout</servlet-name>
<servlet-class>com.feng.servlet.LogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>logout</servlet-name>
<url-pattern>/logout</url-pattern>
</servlet-mapping>
6.LogoutServlet
//处理注销,事件
//首先:如果获取的session对象不是空的我们将他移除,但并不是将整个session给注销,然后重定向到Login.jsp登陆页面,
//反之如果获取的session对象是空的,我们也让它重定向到Login.jsp登陆页面
public class LogoutServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//得到Session的值
Object user_name = req.getSession().getAttribute("USER_NAME");
//判断这个值是否为空
if (user_name!=null){
//移除这个用户,不用把session注销
req.getSession().removeAttribute("USER_NAME");
//并让它重新回到登录页面
resp.sendRedirect("Login.jsp");
}else{
resp.sendRedirect("Login.jsp");
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
- 在这之后,只要用户没输了对用户名,想要通过复制网址来进入成功界面,我们是不能让他进入的,这时就判断session是不是被注销掉了,如果被注销掉了,就别让他进入。我们加上一个过滤器,专门用来了判断session
public class SysFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest requset = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//获取绝对路径
String contextPath = requset.getContextPath();
Object user_name = requset.getSession().getAttribute("USER_NAME");
//过滤器中只做一件事,就是判断session的值是不是空的,是空的就不让它再进入登录成功界面,
//让它重定向到error.jsp界面
if (user_name==null){
//绝对路径,定位到error.jsp界面
response.sendRedirect(contextPath+"/error.jsp");
}
filterChain.doFilter(servletRequest,servletResponse);
}
}