web乱码和路径问题总结

1.乱码问题

 造成乱码的原因有如下两点

  1.编码和解码用的不是同一个字符集

  2.使用了不支持某个语言的字符集

Tomcat打印日志乱码问题

     原因是我们控制台进行解码的时候一般用的是GBK字符集进行解码,而Tomcat日志打印默认使用的是UTF-8字符集,所以在解码的时候会出现乱码问题

所以为了解决这个问题,我们需要在apache-tomcat-10.1.7-windows-x64\apache-tomcat-10.1.7\conf\找到logging.properties文件,修改UTF-8为GBK字符集就可以解决这个问题,那么为什么不让我们的控制台使用UTF-8进行解码呢,因为我们系统还有其他的软件一般都使用的是GBK字符集,所以为了避免其他地方发生错误,我们采用让tomcat适应我们电脑的系统的解码方式

Java文件编译后在jvm出现sout乱码

通过在idea里面对tomcat进行编辑的时候选择vmoption在里面填入如下参数-Dfile.encoding=UTF-8   就可以解决这样的问题

GET和post方式请求乱码问题

在apache-tomcat-10.1.7-windows-x64\apache-tomcat-10.1.7\conf\找到Server.xml文件并在这一个配置行里面加上这样一个代码URIEncoding="对应的浏览器解析的字符集"就可以解决这样的问题

简单的来说就是,以后万一遇到了这种问题,我们就找html文件使用的是什么字符集,然后我们再在tomcat的配置文件中修改成对应的字符集就可以实现

但是请注意,Connector的作用范围是在请求头中进行的解码,get方式会将表单提交的数据塞入请求头中,所以能解决乱码问题,但是post是将数据塞入请求体中,所以解决不了乱码问题

想要解决post方式产生的解码乱码问题,我们需要在后端的代码中进行修改,在后端加上这样一个代码就能指定修改请求体中解码方式

req.setCharacterEncoding("UTF-8");

总结

1.GET方式时,form表单提交的参数会放在uri后面,编码收到charset的影响,这种方式提交数据会跟在uri后面,tomcat会解析uri并且根据xml文件里面规定的解码方式进行解码,所以如果不一致就会发生错误,需要在xml文件中修改

2.post方式时,form表单提交的参数会放请求体中,编码收到charset的影响,但是tomcat里面修改解码规定就不行了,需要在后端修改解码规定以和charset一致

响应的乱码问题

由于客户端和服务端的解码方式不一致而产生的乱码问题,我们可以在后端加上这样一个代码来解决

    resp.setContentType("text/html;charset=utf-8");

通过加上一个这样的代码就可以告知客户端应该用什么方式解码,让客户端去适应后端,而不是让后端适应前端

而我们还可以指定响应报文使用什么编码方式,只需要加上这样一行代码

         resp.setCharacterEncoding("utf-8");

上面两种方式结合,起到了双重保险的作用,即告诉了客户端用什么方式解码又规定了响应报文发送的编码方式

路径问题

前端路径问题

相对路径和绝对路径

1.相对路径

语法:不以斜线开头/

   什么是相对路径,就是指以当前文件所在的目录下去寻找目标资源,举个例子

比如index.html所在的目录就是web目录,以相对路径寻找文件就是在web目录下寻找文件

接下来借用这个图来说说相对路径的寻找资源的原理,首先,客户端向后端发送请求,说我需要inedx.html文件,后端将这个html文件发送给了客户端,我们在html文件中写下了这样一个资源请求的代码<img src="static/img/logo.png"/>此时客户端就依据当前资源的所在路径根据文件中所给予的目标资源路径去拼接到当前资源的所在路径后面,以图例举例,这个index.html文件他所在的请求路径是http://localhost:8080/demo05,注意,没有index.html,index.html是当前资源,,而不是所在路径,此时我们发现,目标资源路径是static/img/logo.png,那么就会将他拼接到http://localhost:8080/demo05的后面形成了一个这样的资源路径:urihttp://localhost:8080/demo05/static/img/logo.png

将他发送给后端去寻找这个图片,然后再发送给前端,这就是相对路径的含义

接下来我们再举一个例子,讲述一下如何返回上层路径寻找资源

我们拥有这样一个资源目录,假设我们在test.html中有一个这样的代码,<img src="/static/img/logo.png"/>,这样子去寻找资源是会失效的,因为她找到的资源所在的路径是web/a/b/c你在后面拼接一个/static/img/logo.png就变成了web/a/b/c/static/img/logo.png,所以这样找是错误的,但是呢,我们有一种方法可以访问到上层的路径,

<img src="../../../static/img/logo.png/>",通过这种方式就可以寻找到我们要的图片资源,这样子的话当浏览器拼接起来这个链接时,是web/a/b/c../../../static/img/logo.png此时浏览器发现有../这个符号,就会自动抵消掉一个上层路径,第一个../抵消掉了/c然后依次往后,最终路径就变成了web/static/img/logo.png就可以拿到我们想要的资源了

但是注意,我们不能只参照当前文件的目录结构去寻找,不能站在我们自己开发文件的角度去寻找资源,这样容易发生错误,举个例子

假定,我们在WEB-INF下面有一个html文件,他的里面有这样一个代码<img src="../../static/img/logo.png"/>我们不能直接访问WEB-INF下的文件的路径,我们需要在Servlet里面进行访问,我们假定有一个servlet类里面有这样一行代码访问到了web-inf文件

 req.getRequestDispatcher("test.html").forward(req, resp);

但是如果这样访问的话,资源路径是什么呢,还会是web-inf的路径吗,答案是不是的,这样的话资源路径就变成了http://localhost:8080/ServletA然后我们再根据src里面所给的资源路径访问的话,进行拼接就变成了http://localhost:8080/../../static/img/logo.png此时两个../../就不能往上面抵消了,再抵消就要打到tomcat老家了,于是路径就变成http://localhost:8080/static/img/logo.png

这种情况下我们发现根本请求不到图片,所以以这种方式请求资源是不靠谱的,我们应该站在浏览器解析资源文件的角度进行思考去请求资源

2.绝对路径

    假如我们使用的是相对路径寻找资源,那么每个文件的资源路径都不同,假如要寻找一个资源的话还需要根据不同文件所在的位置书写不同的目标资源路径,这样会非常的麻烦,于是,采用绝对路径,各个资源都通用的绝对路径是方便的写法

始终以一个固定的路径作为目标出发寻找目标资源

语法:以斜线开头/

举个例子说明绝对路径的寻找方式

假设我们在test.html文件中想要请求一个logo.png资源,此时绝对路径的出发点是http://localhost:8080,假如我们想要寻找到那个图片资源的话,我们需要在html文件中加上一个这样的代码

<img src="/demo05/web/static/img/logo.png"/>

后端路径问题

一.重定向路径问题

1.相对路径
@WebServlet("/ServletA")
public class ServletA extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {


        System.out.println("this is ServletA");

        resp.sendRedirect("ServletB");
  }
}

@WebServlet里面的东西是我们当前类的路径,此时我们的资源路径是http://localhost:8080/ServletA 然后我们通过

resp.sendRedirect("ServletB");

请求b服务这是间接路径,因为前面没有斜杠,那么我们就拼接到后面使得uri=http://localhost:8080/ServletB

但是当我们的servlet的路径变成了

@WebServlet("/x/y/z/ServletA")

这样的时候此时我们的资源路径变成了http://localhost:8080/x/y/z/ServletA

当我们请求b服务时,拼接上去就变成了http://localhost:8080/x/y/z/ServletB这时就会发生请求错误了,那么怎么解决呢,同前端一样我们在前面加上几个../../../就可以抵消前面的路径

2.绝对路径

和前端一样是以localhost为固定开头,然后再加上

resp.sendRedirect("/demo05/ServletB");
这个绝对路径就可以实现绝对路径寻址了

其中还有一种动态寻址方式

 ServletContext context = getServletContext();
        String path=context.getContextPath();
        resp.sendRedirect(path+"/ServletB");

通过这个api能够动态获取资源的上下文路径,实现动态的绝对路径处理 

二.请求转发路径问题

1.相对路径

和重定向同理的处理方式

req.getRequestDispatcher("ServletB").forward(req, resp);

2.绝对路径

注意请求转发的绝对路径的起始点不是http://localhost:8080/而是http://localhost:8080/Demo05

所以我们要注意请求转发的绝对路径后面不要跟着/demo05,直接跟着ServletB上面的@WebServlet()后面的路径即可

req.getRequestDispatcher("/ServletB").forward(req, resp);

逆天白学😅我真吐了

只需要把项目的上下文改成一条斜线,那么所有的绝对路径前面都不用加任何上下文,直接加上一条斜线即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值