解决在 Maven 项目中 EL 表达式无法被解析的问题

方法 1:添加 isELIgnored

在 Maven 项目中的每个 JSP 页面添加以下语句,否则将无法解析 EL 表达式

<%@ page isELIgnored="false" %>

以下为 EL 表达式示例:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page isELIgnored="false" %>

<table>
    <table width="%80" border="1" height="56">
        <tr align="center">
            <td>用户名</td>
            <td>用户密码</td>
            <td>用户年龄</td>
        </tr>

        <c:forEach var="users" items="${userList}">
            <tr align="center">
                <td>${users.username }</td>
                <td>${users.password }</td>
                <td>${users.age }</td>
            </tr>
        </c:forEach>
    </table>

 

方法 2 :修改 web.xml

将 Maven 工程默认的 web.xml 头部这一段

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

替换成如下格式

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
     version="3.0" metadata-complete="true">

 

自设带缓存的 Google Fonts 反向代理以实现海内外高速访问

お久しぶり!好久没有写过新东西啦~

最近使用 Internet Explorer 和 Microsoft Edge 访问博客首页的时候发现特别慢。

打开 Developer Tools 对网站做了 Profiler 后发现 Google Fonts 所占用的 Waiting 时间实在是太长,虽然说现在 googleapis 是能够正常解析了,但是速度还是相当的不忍直视。

解决办法有三:

  1. 禁用 Google Fonts
  2. 使用国内镜像
  3. 使用国外 VPS 做反代

第一种办法无疑是得不偿失的,为了速度而牺牲了整个网页的美观性。

第二种办法看起来挺理想,但是

  1. 大多数国内镜像不支持 HTTPS(对于追求小绿锁的我来说这是绝对不能忍的)
  2. 大多国内访问优秀,国外速度堪忧
  3. 反代在别人服务器上,稳定性没有保障

由于最近博客迁移到了 Azure 上,响应时间和速度还是比较有保证的,最终我选择了第三种方案。


特此声明,本文仅适用于带宽充裕,响应时间较短,速度较快的国外 VPS ,国内机基本免谈

设立反向代理的条件如下:

  1. nginx-extra(Ubuntu 里 apt-get install nginx 出来的 Nginx 并不支持 SSL)
  2. 域名(其实没有域名的话随意弄个免费的 tk 域名也可以)
  3. (可选)SSL 证书(假如你不需要 HTTPS,可以不要)

  • 关于 Nginx 如何安装,点击这里有传送门直达
  • 接下来我要暴力贴出配置,并在必要的地方加上注释,跟着修改即可使用

第一步,创建让 Nginx 存放反代缓存的目录

sudo mkdir -p /var/cache/nginx/cache
sudo mkdir -p /var/cache/nginx/temp

第二步,暴力复制、修改配置文件

正常情况下 Nginx 会在配置文件中 include /etc/nginx/sites-enabled/* 和 include /etc/nginx/conf.d/*.conf

(评论中的 dant 菊苣指出,Debian 系的 Nginx 才有 sites-{enabled,available},RH 系是没有的)

我们选择在 sites-enabled 里头创建配置

sudo vim /etc/nginx/sites-enabled/fonts-proxy.conf

复制粘贴并且根据注释修改以下内容

proxy_temp_file_write_size 128k;
proxy_cache_path  /var/cache/nginx/cache levels=1:2 keys_zone=fonts:300m inactive=7d max_size=10g;
proxy_temp_path   /var/cache/nginx/temp;

upstream google {
    server fonts.googleapis.com:443;
}

upstream gstatic {
    server fonts.gstatic.com:443;
}

server {
    listen 80;
    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
    server_name font.lawrencexs.xyz;
    #限制引用的域名。按需改成自己要用到字体库的域名。做公益服务需要去掉下面的一行以及if
    valid_referers server_name *.lawrencexs.xyz *.winooxx.tk;
    if ($invalid_referer) {
        return 404;
    }

    resolver 8.8.8.8;

    location /css {
    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
        sub_filter 'fonts.gstatic.com' 'font.lawrencexs.xyz';
        sub_filter_once off;
        sub_filter_types text/css;
        proxy_pass_header Server;
        proxy_set_header Host fonts.googleapis.com;
        proxy_set_header Accept-Encoding '';
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass https://google;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }

    location /icon {
    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
        sub_filter 'fonts.gstatic.com' 'font.lawrencexs.xyz';
        sub_filter_once off;
        sub_filter_types text/css;
        proxy_pass_header Server;
        proxy_set_header Host fonts.googleapis.com;
        proxy_set_header Accept-Encoding '';
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass https://google;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host fonts.gstatic.com;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://gstatic;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }
}

#如果你没有证书或者不需要 HTTPS 访问,那么下面这部分你不需要再看了

server {
    #监听 443 端口
    listen 443 ssl spdy;

    #打开 HTTPS
    ssl on;

    #替换下面的证书
    ssl_certificate /etc/ssl/certs/lawrencexs.xyz.crt;
    ssl_certificate_key /etc/ssl/private/lawrencexs.xyz.key;

    ssl_prefer_server_ciphers on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    keepalive_timeout 70;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
    server_name font.lawrencexs.xyz;

    #限制引用的域名。按需改成自己要用到字体库的域名。公益服务需要去掉下面的一行以及if
    valid_referers server_name *.lawrencexs.xyz *.winooxx.tk;
    if ($invalid_referer) {
        return 404;
    }

    resolver 8.8.8.8;

    location /css {
    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
        sub_filter 'fonts.gstatic.com' 'font.lawrencexs.xyz';
        sub_filter_once off;
        sub_filter_types text/css;
        proxy_pass_header Server;
        proxy_set_header Host fonts.googleapis.com;
        proxy_set_header Accept-Encoding '';
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass https://google;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }

    location /icon {
    #将下面的 font.lawrencexs.xyz 替换成你要做反代用的域名
        sub_filter 'fonts.gstatic.com' 'font.lawrencexs.xyz';
        sub_filter_once off;
        sub_filter_types text/css;
        proxy_pass_header Server;
        proxy_set_header Host fonts.googleapis.com;
        proxy_set_header Accept-Encoding '';
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass https://google;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host fonts.gstatic.com;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass https://gstatic;
        proxy_cache fonts;
        proxy_cache_valid  200 304 365d;
        proxy_cache_key $host$uri$is_args$args;
        expires max;
    }
}

最后一步,让 Nginx 重载配置文件

sudo nginx -s reload

如果中间不出差错,那么你就可以使用你新设的反代地址去替换 fonts.googleapis.com 了。

Enjoy! お楽しみください!

使用 Unbound + DNSCrypt 搭建无污染 DNS(deprecated)

声明


  • (2020.03.24 注) 原文写于 2016 年,可能已不适用于现时的网络环境,但原理是相通的,有兴趣的读者可以自行发掘。本人现时已不再使用文中所述的方案,同时亦不再作推荐使用,所以文中相关的问题可能无法解答。敬请谅解。
  • 本文基于 Unbound+DNSCrypt双保险防DNS污染及劫持 与 https://github.com/CNMan/unbound.conf 修改而来,感谢原作者。
  • 本文实际操作平台为 Windows,经试验,本文所用配置文件稍作修改即可运用在 Linux 上

所需工具


DNSCrypt 是 OpenDNS 发布的加密 DNS 工具,可加密 DNS 流量,阻止常见的 DNS 攻击,如重放攻击、观察攻击、时序攻击、中间人攻击和解析伪造攻击。

Unbound 是一款带验证的(validating)、递归(recursive)及具有查询结果缓存(caching) 的 DNS 解析器(resolver).

NirCmd 是一个可以让你的批处理摆脱黑漆漆命令行界面的小工具

NirCmd is a small command-line utility that allows you to do some useful tasks without displaying any user interface.)

流程分析


我们借用一个简洁易懂流程图来解释一下这个递归 DNS 的工作流程

将 Unbound 和 DNSCrypt 组合使用的原因有以下几个:

  1. Unbound 不支持加密查询,但 DNSCrypt 支持
  2. DNSCrypt 不支持缓存已查询结果,而 Unbound 支持
  3. Unbound 还支持自定义解析结果,替代 hosts 、屏蔽广告域名、恶意软件域名等更多功能,相对 hosts 来说更为灵活
  4. 国内域名由国内 DNS 解析,国外域名由 DNSCrypt 向 OpenDNS 解析,既防污染又不影响 CDN

简而言之,如图所示,这套方案就是使用 DNSCrypt 作为 Unbound 默认的上游服务器,而 DNSCrypt 又以 OpenDNS 为上游服务器作加密的 TCP DNS 查询。

使用方法


  • 下载 DNSCryptUnboundNirCmd 32-bit 或 NirCmd 64-bit
  • 解压 dnscrypt-proxy-win32-full-1.6.1.zipC:\Program Files\DNSCrypt\解压 unbound-1.5.7.zipC:\Program Files\unbound\解压 nircmd.zip或 nircmd-x64.zip到 C:\Windows\System32\
  • 下载配置文件并解压到C:\Program Files\unbound
  • 根据实际情况修改localdns.cmdunbound/unbound.conf中的相关路径
  • 运行localdns.cmd
  • 把本地 DNS 设置为 127.0.0.1,如图所示how_to_set_dns_windows
  • (可选)将localdns.cmd放到C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\即可实现开机自启动

一些需要说明的事


  • 常用 hosts 域名配置在unbound.local-zone.hosts.conf广告域名和恶意软件域名配置在unbound.local-zone.block.conf
  • 国内域名默认由 DNSPod Public DNS 和 114DNS 解析,配置在unbound.forward-zone.China.conf,其他域名则由监听在 9999 端口的 DNSCrypt 解析
  • 修改 Unbound 配置文件后,请先检查配置是否正确,再重启 Unbound 并刷新 DNS 解析缓存。详细方法如下
    cd /d "E:\Program Files\unbound\" //切换到你的 Unbound 所在目录
    unbound-checkconf unbound.conf //若配置通过,则提示 no errors in unbound.conf
    unbound-control -c unbound.conf reload
    ipconfig /flushdns

    instruction_to_check_and_restart

致谢