工具类写完了之后,我们可以先把过滤器写了:
package com.dongmu.filter;
import javax.servlet.*;
import java.io.IOException;
public class ChacterEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
servletResponse.setContentType("text/plain;charset=utf-8");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
然后配置web.xml文件,它自动生成的版本比较低,我们进行下面的操作:
把原来的删了再重新加入一个4.0的,不过多赘述细节了.:
<?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>ChacterEncodingFilter</filter-name>
<filter-class>com.dongmu.filter.ChacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ChacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
然后导入我们的静态资源文件,
没有的话可以在gitee上面找到开源的资料可以用于学习。
然后设置欢迎界面,
把这个注释掉,然后启动项目
我们做项目可以一个功能一个功能地来做:
1:由于用户要登录,我们肯定要检测用户信息对不对,那么我们就要查询数据库,所以写一个DAO接口实现类,提供根据用户userCode查询,返回用户信息。
2:dao层持久层是处理底层的,我们的业务方法卸载service层,所以在这个里面判断查询到的密码和用户输入的一不一致。一致的话要返回用户,而不是返回一个boolean值,因为后面的业务中我们还要知道具体是谁登录了。
3:看它跳转的页面是什么
现在实现了页面的跳转,过程中遇到的问题:
1: InputStream stream = new FileInputStream("src/main/resources/db.properties");
InputStream stream = DBUtil.class.getResourceAsStream("/db.properties");
一开始用上面这种方法不知道为什么不行,老是路径不对,但是测试的时候都可以读取到,一到项目里面就找不到文件路径了,下面这种测试的时候和在项目中都可以,不知道为什么。
查了资料说:InputStream is = new FileInputStream(file);读取工程中的配置文件时要求配置文件是在项目根目录下或盘符上,如果配置文件放在类路径下,FileInputStream(file)是读不到的。
Class.getClassLoader.getResourceAsStream(String path) :只能从类根路径下获取,path不能以’/'开头
getResourceAsStream(path):path 不以’/'开头时表示是从此类所在的包下取资源,以’/'开头则是从类根路径下获取。
现假设有一个类(Test.java)要读取配置文件
2:<%@include file="error/error_404.jsp"%>着用方式是会把不同页面的java代码放在一起形成一个页面,所以如果i在我引入的文件中已经定义过了就会报错,而<jsp:include page="error/error_404.jsp"/>这种引入标签的方式不会把java代码放在一起,而是把形成的页面拼在一起。这部分在jsp编译生成的Java代码中可以看到。
3:删掉jsp中的<!DOCTYPE html>.
接下来就是退出以及销毁session防止地址栏恶意登录
在用户退出的时候写一个销毁session的方法,但是用户可以地址栏恶意访问,这时候加一个过滤器,检查没有session的时候就跳转到错误页面,但是这个时候拦截路径怎么配置呢?
如果写成/*的话就会导致我们的登录界面也锁住,导致无论如何也无法登录,所以这时候就体现出来我们把其他的jsp放在个单独的文件夹里的好处了,
我们可以把拦截路径写成/jsp/*这个时候就不会拦截掉登录界面了。
这个时候我们需要注意的是在登录界面跳转到登录后的界面的方式是重定向,不然的话转发它就直接跳转到了登陆后的界面,不会走过滤器。即使不走过滤器也要你密码必须正确才能转发。
个人总结:内部私密资源之间可以请求转发,但是外部和内部之间跳转最好用重定向。但是 这个时候即使写了转发好像也是需要密码正确才能转发到内部资源,所以这个也不是一定的。
如果希望在跳转前后, 能够通过request对象带数据到目的地, 只能使用转发
如果仅仅是做一个跳转,没有其他要求,此时推荐使用转发(转发是一次请求,一次响应,可以减少访问服务器的次数,降低服务器的压力)