يقرأ خادم catBing المضمن SpringBoot حرف unicode في معلمة الاستعلام على أنها خالية

0

لدي نقطة نهاية راحة مصممة في حذاء الربيع. يتم استخدام Tomcat كخادم مضمن. يستغرق معلمة استعلام.

  1. عندما أمرر معلمة الاستعلام كمعلمة 1٪ uFF07 ، يقرأ catcat داخليًا المعلمة على أنها خالية
  2. عندما أمرر معلمة طلب البحث كمعلمة 1٪ FF07 ، يقرأ catcat بعض الأحرف.

تقرأ أداة catcat حرف "٪" فقط عندما يتبعها رقمان سداسيًا عشريًا ، إذا تم وضع u بعد معلمة تحليل catcat "٪" null مع الرسالة

Character decoding failed. Parameter [name] with value [param1%uFF07] has been ignored. Note that the name and value quoted here may be corrupted due to the failed decoding. Use debug level logging to see the original, non-corrupted values. Note: further occurrences of Parameter errors will be logged at DEBUG level.

هنا هو رمز تحكم التمهيد الربيع

@RestController
public class GreetingController {

    private static final String template = "Hello, %s!";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping("/greeting")
    public Greeting greeting(@RequestParam(value = "name", required = false) String name) {
        return new Greeting(counter.incrementAndGet(), String.format(template, name));
    }
}

2 الاجابة

0

لقد وجدت طريقة باستخدام الفلاتر. يمكن العثور على أساسيات الفلاتر هنا . يمكننا اعتراض طلب سلسلة الاستعلام هناك واستخدام فئة Tomcat UDecoder لتحليل سلسلة الاستعلام وإذا تم طرح أي استثناء ، يمكننا إظهار استجابة 400

فئة SimpleFilter العامة تطبق عامل التصفية {

private final UDecoder urlDecoder = new UDecoder();
private final Logger logger = LoggerFactory.getLogger(SimpleFilter.class);

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
        throws IOException, ServletException {
    HttpServletRequest httpServletRequest = (HttpServletRequest) request;
    HttpServletResponse httpServletResponse = (HttpServletResponse) response;

    String queryString = httpServletRequest.getQueryString();
    if (queryString != null) {
        ByteChunk byteChunk = new ByteChunk();
        byteChunk.setBytes(queryString.getBytes(), 0, queryString.length());
        try {
            urlDecoder.convert(byteChunk, true);
        } catch (IOException ioException) {
            logger.error("Hazarduos character found in request parameter.");
            httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
            return;
        }
    }
    chain.doFilter(request, response);
}

@Override
public void destroy() {
}

}}

:مؤلف
0

أنت تمر % تسجيل الدخول عنوان url الخاص بك ، ولكن % هو رمز في رابط لتمرير % كما هي ... يجب أن تمر %25 ثم ستعمل كما هو متوقع.

لذا ، إذا نجحت %25uFF07 ثم سوف تظهر لك %uFF07 كقيمة.

لا حاجة لتغيير أي شيء في خصائص التطبيق أو أي نوع من الإعدادات. لقد اختبرت هذا في مشروعي.

لا تتردد في طلب أي توضيح. نأمل أن يساعد.

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام