过滤器应用

JavaWeb

过滤器应用

  • 用户登录之后才能进入主页!用户注销后就不能静茹主页了!

总结:

JSP页面提交表单给servlet时有两种写法:

(一). 相对路径: < form action=servlet/RegisterLoginServlet method=post>…< /form>

(二). 绝对路径:

  1. < form action="/项目名/servlet/RegisterLoginServlet " method=post>…< /form>

其实绝对路径还有第二种方法:

  1. <formaction="<%=request.getContextPath()%>/servlet/RegisterLoginServlet " method=post>…< /form>
  1. Login.jsp界面
<body>
<h1>登录</h1>
<%--登录界面,获取数据提交到后台,处理,通过web.xml文件中配置的路径login--%>
<%--这里注意login最前面不要加/--%>
<form action="login" method="post">
    <input type="text" name="username">
    <input type="submit">
</form>

</body>
  1. 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>
  1. 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);
    }
}
  1. 失败界面 :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,就直接写上它的绝对路径
  1. 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);
    }
}
  1. 在这之后,只要用户没输了对用户名,想要通过复制网址来进入成功界面,我们是不能让他进入的,这时就判断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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值